package org.rslai.util.autoit;

import java.io.File;

import org.rslai.util.env.EnvVariable;

import autoitx4java.AutoItX;

import com.jacob.com.ComFailException;
import com.jacob.com.ComThread;
import com.jacob.com.LibraryLoader;

public class AutoIt {
	private static AutoIt instance = new AutoIt();

	private AutoItX autoItX = null; // AutoItX 对象
	private boolean isRegisterHook; // 是否已注册过 addShutdownHook

	/**
	 * 返回一个 AutoIt 实例
	 * @return AutoIt 实例
	 */
	public static AutoIt getInstance() {
		return instance;
	}

	/**
	 * 私有化构造函数
	 */
	private AutoIt() {
		// 将 jacob 的的动态库增加到 path 中
		File file;
		if ("x86".equalsIgnoreCase(EnvVariable.getInstance().getOsArch())) {
			file = new File("lib", "jacob-x86.dll");
		} else {
			file = new File("lib", "jacob-x64.dll");
		}
		System.setProperty(LibraryLoader.JACOB_DLL_PATH, file.getAbsolutePath());
	}

	/**
	 * 释放调用 com 控件时占用的内存
	 * 注意：调用次方法将会调用的所有 com 控件都从内存中清除
	 */
	public void release() {
		this.autoItX = null;
		ComThread.Release();
	}

	/**
	 * 注册在 JVM 退出时检测是否 主动执行 release 方法的钩子
	 */
	private void setStopAtShutdown() {
		Runtime.getRuntime().addShutdownHook(new Thread("AutoIt Quit Hook") {
			@Override
			public void run() {
				if (autoItX != null) {
					System.out.println("AutoIt 使用后未调用 release() 方法，请调用 release() 方法释放调用 com 控件时占用的内存，否则会造成内存泄漏。");
				}
			}
		});
	}

	/**
	 * 得到 AutoItX 实例
	 * @return AutoItX 实例
	 */
	private AutoItX getAutoItX() {
		try {
			if (this.autoItX == null) {
				autoItX = new AutoItX();
				if (!isRegisterHook) {
					setStopAtShutdown();
					this.isRegisterHook = true;
				}
			}
			return autoItX;
		} catch (ComFailException e) {
			throw new ComFailException("AutoIt 未安装。请检查是否已安装 AutoIt 或未注册 AutoItX 动态库。\r\n"
					+ "安装文件存放在 other/autoit/autoit-setup.exe 或从 http://www.AutoItX.com （中文论坛）http://www.autoitscript.com/site/（官网）下载。\r\n"
					+ "注意：v3.3.8.1 以上版本执行 run 方法时必须将 flag 设置为 autoitx4java.AutoItX.SW_SHOW 否则可能看不到 run 的程序。");
		}
	}

	/**
	 * 返回 AutoItX 版本
	 * @return AutoItX 版本
	 */
	public String getVersion() {
		return this.getAutoItX().getVersion();
	}

	/**
	 * 返回错误值
	 * @return 错误值
	 */
	public int getError() {
		return this.getAutoItX().getError();
	}

	/**
	 * 获取剪切板里的文本<br/>
	 * 注意：当多个选择文件/目录都存储在剪贴板,文件名/目录名返回文本用@LF分隔.
	 * @return 成功：返回剪贴板的文本字符串<br/>
	 * 失败：如果剪切板为空,把@error设为1，如果剪切板为非文本,把@error设为2，如果无法访问剪切板,把@error设为3或4
	 */
	public String clipGet() {
		return this.getAutoItX().clipGet();
	}

	/**
	 * 在剪切板中写入文本<br/>
	 * 注意：剪切板内现有的内容将被覆盖。空字符串 "" 将清空剪切板.
	 * @param value 要写入剪切板的文本
	 */
	public void clipPut(String value) {
		this.getAutoItX().clipPut(value);
	}

	/**
	 * 映射网络驱动器
	 * @param device 将网络共享文件夹映射到指定设备, 例如 "O:" 或 "LPT1:". 若传递一个空字符串到此参数则会创建一个连接,但不会映射指定驱动器. 如果您指定 "*" 一个未使用的驱动器号将会自动被选择
	 * @param remote 要连接到的远程共享文件夹 "\\server\share".
	 * @return 成功：返回值为true. (See Remarks)<br/>
	 * 失败：返回值为false, 并把 @error 设为相应数值. (See Remarks)<br/>
	 * 1 = 未定义 / 其它错误. @extended 设置为 Windows API 返回的值<br/>
	 * 2 = 访问远程共享被拒绝<br/>
	 * 3 = 设备名已被指派<br/>
	 * 4 = 无效的设备名<br/>
	 * 5 = 无效的远程共享<br/>
	 * 6 = 无效的密码<br/>
	 */
	public boolean driveMapAdd(String device, String remote) {
		return this.getAutoItX().driveMapAdd(device, remote);
	}

	/**
	 * 映射网络驱动器
	 * @param device 将网络共享文件夹映射到指定设备, 例如 "O:" 或 "LPT1:". 若传递一个空字符串到此参数则会创建一个连接,但不会映射指定驱动器. 如果您指定 "*" 一个未使用的驱动器号将会自动被选择
	 * @param remote 要连接到的远程共享文件夹 "\\server\share".
	 * @param flags 0 = 默认，1 = 保持映射连接，8 = 如有需要则显示身份验证对话框
	 * @param username 连接到网络驱动器时使用的用户名, 例如"username" 或 "domain\\username"
	 * @param password 连接到网络驱动器时使用的密码
	 * @return 成功：返回值为true. (See Remarks)<br/>
	 * 失败：返回值为false, 并把 @error 设为相应数值. (See Remarks)<br/>
	 * 1 = 未定义 / 其它错误. @extended 设置为 Windows API 返回的值<br/>
	 * 2 = 访问远程共享被拒绝<br/>
	 * 3 = 设备名已被指派<br/>
	 * 4 = 无效的设备名<br/>
	 * 5 = 无效的远程共享<br/>
	 * 6 = 无效的密码<br/>
	 */
	public boolean driveMapAdd(String device, String remote, int flags, String username, String password) {
		return this.getAutoItX().driveMapAdd(device, remote, flags, username, password);
	}

	/**
	 * 映射网络驱动器
	 * @param device 将网络共享文件夹映射到指定设备, 例如 "O:" 或 "LPT1:". 若传递一个空字符串到此参数则会创建一个连接,但不会映射指定驱动器. 如果您指定 "*" 一个未使用的驱动器号将会自动被选择
	 * @param remote 要连接到的远程共享文件夹 "\\server\share".
	 * @param flags 0 = 默认，1 = 保持映射连接，8 = 如有需要则显示身份验证对话框
	 * @return 成功：返回值为true. (See Remarks)<br/>
	 * 失败：返回值为false, 并把 @error 设为相应数值. (See Remarks)<br/>
	 * 1 = 未定义 / 其它错误. @extended 设置为 Windows API 返回的值<br/>
	 * 2 = 访问远程共享被拒绝<br/>
	 * 3 = 设备名已被指派<br/>
	 * 4 = 无效的设备名<br/>
	 * 5 = 无效的远程共享<br/>
	 * 6 = 无效的密码<br/>
	 */
	public boolean driveMapAdd(String device, String remote, int flags) {
		return this.getAutoItX().driveMapAdd(device, remote, flags);
	}

	/**
	 * 断开网络驱动器<br/>
	 * 注意：若要断开的连接没有被指派驱动器盘符, 请使用连接名(远程共享路径)来中断映射, 例如 \\server\share
	 * @param device 要中断连接的设备名, 例如 "O:" 或 "LPT1:"
	 * @return 成功：返回值为 1<br/>
	 * 失败：返回值为 0, 若没有成功断开连接
	 */
	public boolean driveMapDelete(String device) {
		return this.getAutoItX().driveMapDelete(device);
	}

	/**
	 * 获取已映射网络驱动器的路径
	 * @param device 要查询的设备盘符(驱动器或打印机), 例如"O:" 或 "LPT1:"
	 * @return 成功：返回映射路径, 例如 \\server\share <br/>
	 * 失败：返回一个空字符串 "" 并把 @error 设为 1
	 */
	public String driveMapGet(String device) {
		return this.getAutoItX().driveMapGet(device);
	}

	/**
	 * 从某标准配置文件(*.ini)中删除某个数值<br/>
	 * 注意：标准 INI 文件结构如下:<br/>
	 * [字段名]<br/>
	 * 关键字=值<br/>
	 * @param filename 目标.ini文件路径/文件名
	 * @param section .ini 文件中的某个字段名
	 * @param key 要删除的关键字.若不指定关键字则整个段的内容将被删除.使用 Default 关键字也许同样能用于删除字段
	 * @return 成功：返回值为 1<br/>
	 * 失败：返回值为 0,无法找到指定的字段/关键字或INI文件具有只读属性
	 */
	public boolean iniDelete(String filename, String section, String key) {
		return this.getAutoItX().iniDelete(filename, section, key);
	}

	/**
	 * 从某标准配置文件(*.ini)中删除某个数值<br/>
	 * 注意：标准 INI 文件结构如下:<br/>
	 * [字段名]<br/>
	 * 关键字=值<br/>
	 * @param filename 目标.ini文件路径/文件名
	 * @param section .ini 文件中的某个字段名
	 * @return 成功：返回值为 1<br/>
	 * 失败：返回值为 0,无法找到指定的字段/关键字或INI文件具有只读属性
	 */
	public boolean iniDelete(String filename, String section) {
		return this.getAutoItX().iniDelete(filename, section);
	}

	/**
	 * 从某标准配置文件(*.ini)中读取某个数值
	 * 注意：标准 INI 文件结构如下:<br/>
	 * [字段名]<br/>
	 * 关键字=值<br/>
	 * @param filename 目标.ini文件路径/文件名
	 * @param section .ini 文件中的某个字段名
	 * @param key INI文件中的某个关键字
	 * @param defaultVal 若指定的关键字未被发现则函数将返回此默认值
	 * @return 成功：返回指定的关键字的数值<br/>
	 * 失败：若指定的关键字未被发现则函数将返回默认值
	 */
	public String iniRead(String filename, String section, String key, String defaultVal) {
		return this.getAutoItX().iniRead(filename, section, key, defaultVal);
	}

	/**
	 * 写入一个值到标准格式的 .ini 文件
	 * 注意：标准 INI 文件结构如下:<br/>
	 * [字段名]<br/>
	 * 关键字=值<br/>
	 * @param filename 目标.ini文件路径/文件名
	 * @param section .INI 文件中的某个字段名
	 * @param key INI文件中的某个关键字
	 * @param value 要写入/修改的值
	 * @return 成功：返回值为 1 <b/r>
	 * 失败：返回值为 0 说明文件具有只读属性
	 */
	public Boolean iniWrite(String filename, String section, String key, String value) {
		return this.getAutoItX().iniWrite(filename, section, key, value);
	}

	/**
	 * 生成某区域象素的校验和<br/>
	 * 注意：校验和使我们能检查某个区域里"某些地方"是否有变化,但我们却无从知道具体有什么变化 - 它不会告诉你哪里发生了变化.
	 * @param left 矩形区域左侧的坐标
	 * @param top 矩形区域顶部的坐标
	 * @param right 矩形区域右侧的坐标
	 * @param bottom 矩形区域底部的坐标
	 * @param step 默认情况下每个象素都要校验一次,而此参数可跳过指定数量的象素才校验(可提升执行速度).例如,数值2表示每隔一个象素才校验一次.默认值为 1. 不推荐步进值超过 1 
	 * @return 成功：返回指定区域的校验和<br/>
	 * 失败：返回 0
	 */
	public double pixelChecksum(int left, int top, int right, int bottom, int step) {
		return this.getAutoItX().pixelChecksum(left, top, right, bottom, step);
	}

	/**
	 * 生成某区域象素的校验和<br/>
	 * 注意：校验和使我们能检查某个区域里"某些地方"是否有变化,但我们却无从知道具体有什么变化 - 它不会告诉你哪里发生了变化.
	 * @param left 矩形区域左侧的坐标
	 * @param top 矩形区域顶部的坐标
	 * @param right 矩形区域右侧的坐标
	 * @param bottom 矩形区域底部的坐标
	 * @return 成功：返回指定区域的校验和<br/>
	 * 失败：返回 0
	 */
	public double pixelChecksum(int left, int top, int right, int bottom) {
		return this.getAutoItX().pixelChecksum(left, top, right, bottom);
	}

	/**
	 * 返回指定坐标位置上的象素点的颜色值
	 * @param x X 坐标值
	 * @param y Y 坐标值
	 * @return 成功: 返回指定象素颜色的 十进制 值 <br/>
	 * 失败: 返回 -1 ,说明给定的坐标不合法
	 */
	public float pixelGetColor(int x, int y) {
		return this.getAutoItX().pixelGetColor(x, y);
	}

	/**
	 * 在指定矩形区域中搜寻与指定颜色值匹配的象素(并返回第一个匹配的象素的坐标)
	 * @param left 矩形区域左侧的坐标
	 * @param top 矩形区域顶部的坐标
	 * @param right 矩形区域右侧的坐标
	 * @param bottom 矩形区域底部的坐标
	 * @param color 要搜索的颜色值(十进制或十六进制皆可)
	 * @param shadeVariation 一个介于0到255之间的数值,用以指定允许的颜色偏差范围.默认值为0(表示完全匹配)
	 * @param step 默认情况下每个象素都要校验一次,而此参数可跳过指定数量的象素才校验(可提升执行速度).例如,数值2表示每隔一个象素才校验一次.默认值为 1
	 * @return 成功: 返回一个含有两个元素的数组,分别储存着指定象素的坐标(Array[0] = x , Array[1] = y)<br/>
	 * 失败: 把 @error 设为 1,说明指定的颜色未被发现.
	 */
	public long[] pixelSearch(int left, int top, int right, int bottom, int color, int shadeVariation, int step) {
		return this.getAutoItX().pixelSearch(left, top, right, bottom, color, shadeVariation, step);
	}

	/**
	 * 在指定矩形区域中搜寻与指定颜色值匹配的象素(并返回第一个匹配的象素的坐标)
	 * @param left 矩形区域左侧的坐标
	 * @param top 矩形区域顶部的坐标
	 * @param right 矩形区域右侧的坐标
	 * @param bottom 矩形区域底部的坐标
	 * @param color 要搜索的颜色值(十进制或十六进制皆可)
	 * @return 成功: 返回一个含有两个元素的数组,分别储存着指定象素的坐标(Array[0] = x , Array[1] = y)<br/>
	 * 失败: 把 @error 设为 1,说明指定的颜色未被发现.
	 */
	public long[] pixelSearch(int left, int top, int right, int bottom, int color) {
		return this.getAutoItX().pixelSearch(left, top, right, bottom, color);
	}

	/**
	 * 向激活窗口发送模拟键击操作
	 * @param keys 要发送的按键序列
	 * @param isRaw 更改程序处理"按键"的方式:<br/>
	 * 标志 = 0 (默认),按键序列中含有的特殊字符比如 + 和 ! 将被视为 SHIFT 和 ALT 键<br/>
	 * 标志 = 1, 按键将按原样发送
	 */
	public void send(String keys, boolean isRaw) {
		this.getAutoItX().send(keys, isRaw);
	}

	/**
	 * 向激活窗口发送模拟键击操作
	 * @param keys 要发送的按键序列
	 */
	public void send(String keys) {
		this.getAutoItX().send(keys, false);
	}

	/**
	 * 在屏幕的任意位置显示一个工具提示
	 * @param text 工具提示的文本(如果是空字符串则清除现有的工具提示). 
	 * @param x 工具提示出现位置的 X 坐标
	 * @param y 工具提示出现位置的 Y 坐标
	 */
	public void toolTip(String text, int x, int y) {
		this.getAutoItX().toolTip(text, x, y);
	}

	/**
	 * 在屏幕的任意位置显示一个工具提示
	 * @param text 工具提示的文本(如果是空字符串则清除现有的工具提示).
	 */
	public void toolTip(String text) {
		this.getAutoItX().toolTip(text);
	}

	/**
	 * 屏蔽/启用鼠标与键盘(输入)
	 * @param disableInput 1 = 屏蔽用户输入、0 = 启用用户输入
	 */
	public void blockInput(boolean disableInput) {
		this.getAutoItX().blockInput(disableInput);
	}

	/**
	 * 弹出或关闭光驱
	 * @param drive 要控制的光驱盘符, 格式为 D:, E:, 等等.
	 * @param status 指定要弹出或关闭光驱: "open"(弹出)或者 "closed"(关闭)
	 * @return 成功: 返回值为1 <br/>
	 * 失败: 返回值为0,说明指定驱动器已被CD刻录软件锁定或该盘符并非光驱
	 */
	public boolean cdTray(String drive, String status) {
		return this.getAutoItX().cdTray(drive, status);
	}

	/**
	 * 检查当前用户是否拥有管理员权限
	 * @return 成功: 返回值为 1,说明当前用户拥有管理员权限 <br/>
	 * 失败: 返回值为 0,说明用户不是管理员.
	 */
	public boolean isAdmin() {
		return this.getAutoItX().isAdmin();
	}

	/**
	 * 调整Autoit各种函数/参数的运作方式
	 * @param option 要修改的选项.请参看 AutoIt 手册
	 * @param param 需要分配给选项的值. 因设置的选项不同而类型与意思不同. 参考下面的注意部分. 如果没有参数, 函数会返回目前的选项值. 关键字 Default 可以用于重置选项为默认值.
	 * @return 成功: 返回返回上一次设置的值.<br/>
	 * 失败: 设置错误为非零. 失败可能是因为参数无效(比如选项根本不存在).
	 */
	public String autoItSetOption(String option, String param) {
		return this.getAutoItX().autoItSetOption(option, param);
	}

	/**
	 * 调整Autoit各种函数/参数的运作方式
	 * @param option 要修改的选项.请参看 AutoIt 手册
	 * @param param 需要分配给选项的值. 因设置的选项不同而类型与意思不同. 参考下面的注意部分. 如果没有参数, 函数会返回目前的选项值. 关键字 Default 可以用于重置选项为默认值.
	 * @return 成功: 返回返回上一次设置的值.<br/>
	 * 失败: 设置错误为非零. 失败可能是因为参数无效(比如选项根本不存在).
	 */
	public String setOption(String option, String param) {
		return this.getAutoItX().setOption(option, param);
	}

	/**
	 * 执行鼠标点击操作
	 * @param button 要点击的按钮:"left"(左键),"right"(右键),"middle"(中键),"main"(主键),"menu"(菜单键),"primary"(主要按钮),"secondary"(次要按钮).
	 * @param x 鼠标要移动到的目标坐标值 X.若两者都留空则使用当前位置.
	 * @param y 鼠标要移动到的目标坐标值 Y.若两者都留空则使用当前位置.
	 * @param clicks 要点击鼠标按钮的次数.默认值为 1.
	 * @param speed 鼠标移动速度,可设数值范围在 1(最快)和 100(最慢)之间.若设置速度为 0 则立即移动鼠标到指定位置.默认速度为 10.
	 */
	public void mouseClick(String button, int x, int y, int clicks, int speed) {
		this.getAutoItX().mouseClick(button, x, y, clicks, speed);
	}

	/**
	 * 执行鼠标点击操作
	 * @param button 要点击的按钮:"left"(左键),"right"(右键),"middle"(中键),"main"(主键),"menu"(菜单键),"primary"(主要按钮),"secondary"(次要按钮).
	 * @param clicks 要点击鼠标按钮的次数.默认值为 1.
	 * @param speed 鼠标移动速度,可设数值范围在 1(最快)和 100(最慢)之间.若设置速度为 0 则立即移动鼠标到指定位置.默认速度为 10.
	 */
	public void mouseClick(String button, int clicks, int speed) {
		this.getAutoItX().mouseClick(button, clicks, speed);
	}

	/**
	 * 执行鼠标拖曳操作
	 * @param button 要点击的按钮:"left"(左键),"right"(右键),"middle"(中键),"main"(主键),"menu"(菜单键),"primary"(主要按钮),"secondary"(次要按钮).
	 * @param x 拖曳操作的起始坐标值 X
	 * @param y 拖曳操作的起始坐标值 Y
	 * @param x2 拖曳操作的结束坐标值 X
	 * @param y2 拖曳操作的结束坐标值 Y
	 * @param speed 鼠标移动速度,可设数值范围在 1(最快)和 100(最慢)之间.若设置速度为 0 则立即移动鼠标到指定位置.默认速度为 10
	 */
	public void mouseClickDrag(String button, int x, int y, int x2, int y2, int speed) {
		this.getAutoItX().mouseClickDrag(button, x, y, x2, y2, speed);
	}

	/**
	 * 执行鼠标拖曳操作
	 * @param button 要点击的按钮:"left"(左键),"right"(右键),"middle"(中键),"main"(主键),"menu"(菜单键),"primary"(主要按钮),"secondary"(次要按钮).
	 * @param x 拖曳操作的起始坐标值 X
	 * @param y 拖曳操作的起始坐标值 Y
	 * @param x2 拖曳操作的结束坐标值 X
	 * @param y2 拖曳操作的结束坐标值 Y
	 */
	public void mouseClickDrag(String button, int x, int y, int x2, int y2) {
		this.getAutoItX().mouseClickDrag(button, x, y, x2, y2);
	}

	/**
	 * 在当前位置产生一个鼠标按下(按键)事件
	 * @param button 要点击的按钮:"left"(左键),"right"(右键),"middle"(中键),"main"(主键),"menu"(菜单键),"primary"(主要按钮),"secondary"(次要按钮).
	 */
	public void mouseDown(String button) {
		this.getAutoItX().mouseDown(button);
	}

	/**
	 * 返回当前鼠标指针光标的ID
	 * @return 0 = UNKNOWN (未知,包括指针和手型图标)
     * <br/> 1 = APPSTARTING (后台运行)
     * <br/> 2 = ARROW (正常选择)
     * <br/> 3 = CROSS (精确定位)
     * <br/> 4 = HELP (帮助选择)
     * <br/> 5 = IBEAM (选定文本)
     * <br/> 6 = ICON (图标)
     * <br/> 7 = NO (不可用)
     * <br/> 8 = SIZE (设置大小)
     * <br/> 9 = SIZEALL (移动)
     * <br/> 10 = SIZENESW (东北西南沿对角线调整)
     * <br/> 11 = SIZENS (垂直调整)
     * <br/> 12 = SIZENWSE (西北东南沿对角线调整)
     * <br/> 13 = SIZEWE (水平调整)
     * <br/> 14 = UPARROW (候选)
     * <br/> 15 = WAIT (忙碌)
     * <br/> 16 = HAND(手型)
	 */
	public int mouseGetCursor() {
		return this.getAutoItX().mouseGetCursor();
	}

	/**
	 * 获取当前鼠标的 X 坐标位置
	 * @return X 坐标 (横向)
	 */
	public int mouseGetPosX() {
		return this.getAutoItX().mouseGetPosX();
	}

	/**
	 * 获取当前鼠标的 Y 坐标位置
	 * @return Y 坐标 (横向)
	 */
	public int mouseGetPosY() {
		return this.getAutoItX().mouseGetPosY();
	}

	/**
	 * 移动鼠标指针
	 * @param x 要移动到的屏幕上目标位置的 X 坐标.
	 * @param y 要移动到的屏幕上目标位置的 Y 坐标.
	 * @param speed 鼠标移动速度,可设数值范围在 1(最快)和 100(最慢)之间.若设置速度为 0 则立即移动鼠标到指定位置.默认速度为 10.
	 * @return true: 成功<br/>
	 * false：失败
	 */
	public boolean mouseMove(int x, int y, int speed) {
		return this.getAutoItX().mouseMove(x, y, speed);
	}

	/**
	 * 移动鼠标指针
	 * @param x 要移动到的屏幕上目标位置的 X 坐标.
	 * @param y 要移动到的屏幕上目标位置的 Y 坐标.
	 * @return true: 成功<br/>
	 * false：失败
	 */
	public boolean mouseMove(int x, int y) {
		return this.getAutoItX().mouseMove(x, y);
	}

	/**
	 * 在当前位置产生一个鼠标释放(按键)事件
	 * @param button 要点击的按钮:"left"(左键),"right"(右键),"middle"(中键),"main"(主键),"menu"(菜单键),"primary"(主要按钮),"secondary"(次要按钮).
	 */
	public void mouseUp(String button) {
		this.getAutoItX().mouseUp(button);
	}

	/**
	 * 产生向上或向下滚动鼠标滚轮事件.仅支持NT/2000/XP及更高
	 * @param direction "up"(上) 或 "down"(下)
	 * @param clicks 滚动的次数.默认值为 1
	 */
	public void mouseWheel(String direction, int clicks) {
		this.getAutoItX().mouseWheel(direction, clicks);
	}

	/**
	 * 产生向上或向下滚动鼠标滚轮事件.仅支持NT/2000/XP及更高
	 * @param direction "up"(上) 或 "down"(下)
	 */
	public void mouseWheel(String direction) {
		this.getAutoItX().mouseWheel(direction);
	}

	/**
	 * 终止某个进程
	 * @param process 要终止的进程的名称或 PID(进程标识符)
	 */
	public void processClose(String process) {
		this.getAutoItX().processClose(process);
	}

	/**
	 * 检查指定进程是否存在
	 * @param process 要检查的进程的名称或 PID(进程标识符)
	 * @return 成功: 返回进程的 PID <br/>
	 * 失败: 返回0,进程不存在.
	 */
	public int processExists(String process) {
		return this.getAutoItX().processExists(process);
	}

	/**
	 * 设置某个进程的优先级
	 * @param process 要设置的进程的名称或 PID(进程标识符)
	 * @param priority 要设置的优先级<br/>
	 * 0 - 空闲/低<br/>
	 * 1 - 低于标准<br/>
	 * 2 - 标准<br/>
	 * 3 - 高于标准<br/>
	 * 4 - 高<br/>
	 * 5 - 实时(请谨慎使用,可能会导致系统不稳定)
	 * @return 成功: 返回值为 1 <br/>
	 * 失败: 返回值为0并把 @error 设为 1.若试图使用不支持的优先级则把 @error 设为 2
	 */
	public boolean processSetPriority(String process, int priority) {
		return this.getAutoItX().processSetPriority(process, priority);
	}

	/**
	 * 暂停脚本的执行直至给定进程出现为止
	 * @param process 目标进程的名称
	 * @param timeout 指定要等待的时间长度(默认为一直等待)
	 * @return true: 成功<br/>
	 * false: 失败 
	 */
	public boolean processWait(String process, int timeout) {
		return this.getAutoItX().processWait(process, timeout);
	}

	/**
	 * 暂停脚本的执行直至给定进程出现为止
	 * @param process 目标进程的名称
	 * @return true: 成功<br/>
	 * false: 失败 
	 */
	public boolean processWait(String process) {
		return this.getAutoItX().processWait(process);
	}

	/**
	 * 暂停脚本的执行直至给定进程不再存在为止
	 * @param process 目标进程的名称或 PID(进程标识符)
	 * @param timeout 指定要等待的时间长度(默认为一直等待)
	 * @return true: 成功<br/>
	 * false: 失败 
	 */
	public boolean processWaitClose(String process, int timeout) {
		return this.getAutoItX().processWaitClose(process, timeout);
	}

	/**
	 * 暂停脚本的执行直至给定进程不再存在为止
	 * @param process 目标进程的名称或 PID(进程标识符)
	 * @return true: 成功<br/>
	 * false: 失败 
	 */
	public boolean processWaitClose(String process) {
		return this.getAutoItX().processWaitClose(process);
	}

	/**
	 * 运行外部程序 <br>
	 * 如果想等待程序运行结束后再运行之后的程序请使用 runwait 方法
	 * @param filename 程序所在的完整路径(文件格式为 EXE,BAT,COM 或 PIF)
	 * @param workingDirectory 工作目录，这个路径不一定指向程序所在路径
	 * @param flag 启动程序时的初始状态:<br/>
	 * SW_HIDE = 隐藏窗口<br/>
	 * SW_MINIMIZE = 最小化窗口<br/>
	 * SW_MAXIMIZE = 最大化窗口
	 * @return 成功：返回所运行程序的 PID(进程标识符)<br/>
	 * 失败：返回0并设置 @error 为非0值
	 */
	public int run(String filename, String workingDirectory, int flag) {
		return this.getAutoItX().run(filename, workingDirectory, flag);
	}

	/**
	 * 运行外部程序 <br>
	 * 如果想等待程序运行结束后再运行之后的程序请使用 runwait 方法
	 * @param filename 程序所在的完整路径(文件格式为 EXE,BAT,COM 或 PIF)
	 * @param workingDirectory 工作目录，这个路径不一定指向程序所在路径
	 * @return 成功：返回所运行程序的 PID(进程标识符)<br/>
	 * 失败：返回0并设置 @error 为非0值
	 */
	public int run(String filename, String workingDirectory) {
		return this.getAutoItX().run(filename, workingDirectory);
	}

	/**
	 * 运行外部程序<br/>
	 * 注意：v3.3.8.1以上版本 AutoIt 请使用 run(filename, workingDirectory, flag) 方法否则可能看不到程序界面 <br>
	 * 如果想等待程序运行结束后再运行之后的程序请使用 runwait 方法
	 * @param filename 程序所在的完整路径(文件格式为 EXE,BAT,COM 或 PIF)
	 * @return 成功：返回所运行程序的 PID(进程标识符)<br/>
	 * 失败：返回0并设置 @error 为非0值
	 */
	public int run(String filename) {
		return this.getAutoItX().run(filename);
	}

	/**
	 * 初始化一个用于 Run 和 RunWait 操作的用户凭证。 仅支持 2000/XP 或更高版本
	 * @param username 需要使用的用户名
	 * @param domain 用于甄别的域名称
	 * @param password 用户的密码
	 * @param options 登录标志<br/>
	 * 0 - 不加载用户配置文件<br/>
	 * 1 - （默认）加载用户配置文件<br/>
	 * 2 - 使用网络认证<br/>
	 * 4 - 继承调用程序的环境变量替换用户的环境变量
	 * @return 0: 失败，例如操作系统不支持此功能。<br/>
	 * 1: 成功（如果登录信息无效，随后运行 runwait 命令将失败）
	 */
	public int runAsSet(String username, String domain, String password, int options) {
		return this.getAutoItX().runAsSet(username, domain, password, options);
	}

	/**
	 * 初始化一个用于 Run 和 RunWait 操作的用户凭证。 仅支持 2000/XP 或更高版本
	 * @param username 需要使用的用户名
	 * @param domain 用于甄别的域名称
	 * @param password 用户的密码
	 * @return 0: 失败，例如操作系统不支持此功能。<br/>
	 * 1: 成功（如果登录信息无效，随后运行 runwait 命令将失败）
	 */
	public int runAsSet(String username, String domain, String password) {
		return this.getAutoItX().runAsSet(username, domain, password);
	}

	/**
	 * 运行一个外部程序并暂停脚本的执行直至该程序执行完毕
	 * @param filename 要执行的可执行文件的完整路径(文件格式为 EXE,BAT,COM 或 PIF)
	 * @param workingDirectory 工作目录.不一定非得是程序所在的目录.
	 * @param flag 启动程序时的"显示"状态:<br/>
	 * SW_HIDE = 隐藏窗口(或者Default关键字)<br/>
	 * SW_MINIMIZE = 最小化窗口<br/>
	 * SW_MAXIMIZE = 最大化窗口
	 * return 成功: 返回所运行程序的退出代码<br/>
	 * 失败: 返回 0 并设置@error为非0
	 */
	public int runWait(String filename, String workingDirectory, int flag) {
		return this.getAutoItX().runWait(filename, workingDirectory, flag);
	}

	/**
	 * 运行一个外部程序并暂停脚本的执行直至该程序执行完毕
	 * @param filename 要执行的可执行文件的完整路径(文件格式为 EXE,BAT,COM 或 PIF)
	 * @param workingDirectory 工作目录.不一定非得是程序所在的目录.
	 * @return 成功: 返回所运行程序的退出代码<br/>
	 * 失败: 返回 0 并设置@error为非0
	 */
	public int runWait(String filename, String workingDirectory) {
		return this.getAutoItX().runWait(filename, workingDirectory);
	}

	/**
	 * 运行一个外部程序并暂停脚本的执行直至该程序执行完毕
	 * @param filename 要执行的可执行文件的完整路径(文件格式为 EXE,BAT,COM 或 PIF)
	 * @return 成功: 返回所运行程序的退出代码<br/>
	 * 失败: 返回 0 并设置@error为非0
	 */
	public int runWait(String filename) {
		return this.getAutoItX().runWait(filename);
	}

	/**
	 * 关机
	 * @param code shutdown 命令的各种代码的组合值
	 * 0 = Logoff(注销)<br/>1 = Shutdown(关机)
	 * 2 = Reboot(重启)<br/>
	 * 4 = Force(强制执行)<br/>
	 * 8 = Power down(关机)<br/>
	 * 16= Force if hung(强制挂起)<br/>
	 * 32= Standby(待机)<br/>
	 * 64= Hibernate(休眠)
	 * @return 成功: 返回值 1 <br/>
	 * 失败: 返回值 0 并按照 GetLastError() 的值设置 @error.
	 */
	public boolean shutdown(int code) {
		return this.getAutoItX().shutdown(code);
	}

	/**
	 * 从注册表中删除一个 key
	 * @param keyname 注册表键名
	 * @return 0：注册表键名不存在<br/>
	 * 1：成功<br/>
	 * 2：失败
	 */
	public int regDeleteKey(String keyname) {
		return this.getAutoItX().regDeleteKey(keyname);
	}

	/**
	 * 从注册表中删除一个 value
	 * @param keyname 注册表键名
	 * @return 0：注册表键名不存在<br/>
	 * 1：成功<br/>
	 * 2：失败
	 */
	public int regDeleteVal(String keyname) {
		return this.getAutoItX().regDeleteVal(keyname);
	}

	/**
	 * 读取指定子键的名称
	 * @param keyname 要读取的注册表的根键或其子键
	 * @param instance 要获取的子键序数,从1开始
	 * @return 成功: 返回目标子键名 <br/>
	 * 失败: 返回空字符串 "",并把 @error 设为以下值之一:<br/>
	 * 1 如果不能打开被请求的键<br/>
	 * 2 如果不能打开被请求的主键<br/>
	 * 3 如果不能远程连接到注册表<br/>
	 * -1 如果不能打开被请求的子键(可能是子键序数超出范围)
	 */
	public String regEnumKey(String keyname, int instance) {
		return this.getAutoItX().regEnumKey(keyname, instance);
	}

	/**
	 * 读取指定值项的名称
	 * @param keyname 要读取的注册表的根键或其子键
	 * @param instance 要获取的子键序数,从1开始
	 * @return 成功: 返回目标子键名 <br/>
	 * 失败: 返回空字符串 "",并把 @error 设为以下值之一:<br/>
	 * 1 如果不能打开被请求的键<br/>
	 * 2 如果不能打开被请求的主键<br/>
	 * 3 如果不能远程连接到注册表<br/>
	 * -1 如果不能打开被请求的子键(可能是子键序数超出范围)
	 */
	public String regEnumVal(String keyname, int instance) {
		return this.getAutoItX().regEnumVal(keyname, instance);
	}

	/**
	 * 读取注册表指定的值
	 * @param keyname 要读取的注册表的根键或其子键
	 * @param valueName 要读取的值项名
	 * @return 成功: 返回指定值项的数据. @EXTENDED 设置类型为 $REG_... 值的类型,这些类型定义于 "Constants.au3" 包含文件.<br/>
	 * 失败: 返回空字符串 "",并把 @error 设为以下值之一:<br/>
	 * 1 如果不能打开被请求的键<br/>
	 * 2 如果不能打开被请求的主键<br/>
	 * 3 如果不能远程连接到注册表<br/>
	 * -1 如果不能打开被请求的值<br/>
	 * -2 如果值的类型是不支持的
	 */
	public String regRead(String keyname, String valueName) {
		return this.getAutoItX().regRead(keyname, valueName);
	}

	/**
	 * 创建一个主键,子键或值项
	 * @param keyname 要写入的注册表键.若其它参数未指定则只创建该键
	 * @param valueName 要写入的值名
	 * @param type 目标值项的数据类型,比如:"REG_SZ","REG_MULTI_SZ","REG_EXPAND_SZ","REG_DWORD" , "REG_QWORD" 或 "REG_BINARY"
	 * @param value 数值数据
	 * @return 成功: 返回值为 1<br/>
	 * 失败: 返回值为 0,写入注册表键或者值发生错误<br/>
	 * error 将设为以下值之一<br/>
	 * 1 如果不能打开被请求的键<br/>
	 * 2 如果不能打开被请求的主键<br/>
	 * 3 如果不能远程连接到注册表<br/>
	 * -1 如果不能打开被请求的值<br/>
	 * -2 如果值的类型是不支持的
	 */
	public boolean regWrite(String keyname, String valueName, String type, String value) {
		return this.getAutoItX().regWrite(keyname, valueName, type, value);
	}

	/**
	 * 使脚本暂停指定时间段
	 * @param delay 暂停执行的时间长度(以毫秒为单位,1000毫秒 = 1秒)
	 */
	public void sleep(int delay) {
		this.getAutoItX().sleep(delay);
	}

	/**
	 * 向指定控件发送鼠标点击命令
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param controlID 控件ID,要进行交互的控件.参考 控件 的说明
	 * @param button 要点击的按钮, 可以是"left"(左键), "right"(右键), "middle"(中键), "main"(主要), "menu"(菜单), "primary"(主键), "secondary"(次键). 默认为left(左键)
	 * @param clicks 要点击鼠标按钮的次数. 默认值为 1
	 * @param x 要点击控件的位置(X坐标). 默认为控件中心
	 * @param y 要点击控件的位置(Y坐标). 默认为控件中心
	 * @return 成功: 返回 1<br/>
	 * 失败: 返回 0
	 */
	public boolean controlClick(String title, String text, String controlID, String button, int clicks, int x, int y) {
		return this.getAutoItX().controlClick(title, text, controlID, button, clicks, x, y);
	}

	/**
	 * 向指定控件发送鼠标点击命令
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param controlID 控件ID,要进行交互的控件.参考 控件 的说明
	 * @param button 要点击的按钮, 可以是"left"(左键), "right"(右键), "middle"(中键), "main"(主要), "menu"(菜单), "primary"(主键), "secondary"(次键). 默认为left(左键)
	 * @param clicks 要点击鼠标按钮的次数. 默认值为 1
	 * @return 成功: 返回 1<br/>
	 * 失败: 返回 0
	 */
	public boolean controlClick(String title, String text, String controlID, String button, int clicks) {
		return this.getAutoItX().controlClick(title, text, controlID, button, clicks);
	}

	/**
	 * 向指定控件发送鼠标点击命令
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param controlID 控件ID,要进行交互的控件.参考 控件 的说明
	 * @param button 要点击的按钮, 可以是"left"(左键), "right"(右键), "middle"(中键), "main"(主要), "menu"(菜单), "primary"(主键), "secondary"(次键). 默认为left(左键)
	 * @return 成功: 返回 1<br/>
	 * 失败: 返回 0
	 */
	public boolean controlClick(String title, String text, String controlID, String button) {
		return this.getAutoItX().controlClick(title, text, controlID, button);
	}

	/**
	 * 向指定控件发送鼠标点击命令
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param controlID 控件ID,要进行交互的控件.参考 控件 的说明
	 * @return 成功: 返回 1<br/>
	 * 失败: 返回 0
	 */
	public boolean controlClick(String title, String text, String controlID) {
		return this.getAutoItX().controlClick(title, text, controlID);
	}

	/**
	 * 弹出/下拉 组合框(ComboBox)的列表
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 */
	public void controlCommandShowDropdown(String title, String text, String control) {
		this.getAutoItX().controlCommandShowDropdown(title, text, control);
	}

	/**
	 * 收回/隐藏 组合框(ComboBox)的列表
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 */
	public void controlCommandHideDropDown(String title, String text, String control) {
		this.getAutoItX().controlCommandHideDropDown(title, text, control);
	}

	/**
	 * 使目标按钮(复选框/单选框)变为选中状态
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 */
	public void controlCommandCheck(String title, String text, String control) {
		this.getAutoItX().controlCommandCheck(title, text, control);
	}

	/**
	 * 使目标按钮(复选框/单选框)变为非选中状态
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 */
	public void controlCommandUncheck(String title, String text, String control) {
		this.getAutoItX().controlCommandUncheck(title, text, control);
	}

	/**
	 * 在 ListBox 或 ComboBox 的编辑框后面附加指定字符串
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param string 字符串
	 */
	public void controlCommandAddString(String title, String text, String control, String string) {
		this.getAutoItX().controlCommandAddString(title, text, control, string);
	}

	/**
	 * 删除在 ListBox 或 ComboBox 的编辑框中指定的字符串(从0开始,0 代表第一个)
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param occurance 出现次序
	 */
	public void controlCommandDeleteString(String title, String text, String control, String occurance) {
		this.getAutoItX().controlCommandDeleteString(title, text, control, occurance);
	}

	/**
	 * 在目标编辑框中插入符(caret)所在位置后插入指定字符串
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param string 字符串
	 */
	public void controlCommandEditPaste(String title, String text, String control, String string) {
		this.getAutoItX().controlCommandEditPaste(title, text, control, string);
	}

	/**
	 * 通过指定出现次序(从0开始,0 代表第一个)把 ListBox 或 ComboBox 的当前选择项设为指定的项目
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param occurance 出现次序
	 */
	public void controlCommandSetCurrentSelection(String title, String text, String control, String occurance) {
		this.getAutoItX().controlCommandSetCurrentSelection(title, text, control, occurance);
	}

	/**
	 * 通过指定字符串把 ListBox 或 ComboBox 的当前选择项设为匹配字符串的项目
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param string 字符串
	 */
	public void controlCommandSelectString(String title, String text, String control, String string) {
		this.getAutoItX().controlCommandSelectString(title, text, control, string);
	}

	/**
	 * 返回控件是否可见
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return true：可见<br/>
	 * false：不可见
	 */
	public boolean controlCommandIsVisible(String title, String text, String control) {
		return this.getAutoItX().controlCommandIsVisible(title, text, control);
	}

	/**
	 * 返回(复选框/单选框)是否选中
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return true：选中<br/>
	 * false：未选中
	 */
	public boolean controlCommandIsChecked(String title, String text, String control) {
		return this.getAutoItX().controlCommandIsChecked(title, text, control);
	}

	/**
	 * 返回目标控件是否可用
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return true：可用<br/>
	 * false：不可用
	 */
	public boolean controlCommandIsEnabled(String title, String text, String control) {
		return this.getAutoItX().controlCommandIsEnabled(title, text, control);
	}

	/**
	 * 返回在 ListBox 或 ComboBox 的编辑框中与指定字符串匹配项目的出现次序(从0开始,0 代表第一个)
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param string 字符串
	 * @return 出现次序(从0开始,0 代表第一个)
	 */
	public int controlCommandFindString(String title, String text, String control, String string) {
		return this.getAutoItX().controlCommandFindString(title, text, control, string);
	}

	/**
	 * 返回在目标编辑框中插入符(caret,光标)的所在行号
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return true：光标所在行号
	 */
	public int controlCommandGetCurrentLine(String title, String text, String control) {
		return this.getAutoItX().controlCommandGetCurrentLine(title, text, control);
	}

	/**
	 * 返回在目标编辑框中插入符(caret,光标)的所在列号
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return true：光标所在列号
	 */
	public int controlCommandGetCurrentCol(String title, String text, String control) {
		return this.getAutoItX().controlCommandGetCurrentCol(title, text, control);
	}

	/**
	 * 返回目标编辑框中的总行数
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return true：总行数
	 */
	public int controlCommandGetLineCount(String title, String text, String control) {
		return this.getAutoItX().controlCommandGetLineCount(title, text, control);
	}

	/**
	 * 返回 ListBox 或 ComboBox 控件当前选中的项目名
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param charLength 字符长度
	 * @return 当前选中的项目名
	 */
	public String controlCommandGetCurrentSelection(String title, String text, String control, int charLength) {
		return this.getAutoItX().controlCommandGetCurrentSelection(title, text, control, charLength);
	}

	/**
	 * 返回目标编辑框中的(用户用鼠标或其它方式)选定的文本	
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param charLength 字符长度
	 * @return 当前选中的项目文本	
	 */
	public String controlCommandGetSelected(String title, String text, String control, int charLength) {
		return this.getAutoItX().controlCommandGetSelected(title, text, control, charLength);
	}

	/**
	 * 使 SysTabControl32 控件切换到(左边的)下一个标签
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 */
	public void controlCommandTabLeft(String title, String text, String control) {
		this.getAutoItX().controlCommandTabLeft(title, text, control);
	}

	/**
	 * 使 SysTabControl32 控件切换到(右边的)下一个标签
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 */
	public void controlCommandTabRight(String title, String text, String control) {
		this.getAutoItX().controlCommandTabRight(title, text, control);
	}

	/**
	 * 返回在 SysTabControl32 控件中当前显示的标签编号(从1开始,1代表左边第一个)
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return 控件中当前显示的标签编号
	 */
	public String controlCommandCurrentTab(String title, String text, String control) {
		return this.getAutoItX().controlCommandCurrentTab(title, text, control);
	}

	/**
	 * 禁用或使某控件变成灰色不可用状态
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return true：成功<br/>
	 * false：失败
	 */
	public boolean controlDisable(String title, String text, String control) {
		return this.getAutoItX().controlDisable(title, text, control);
	}

	/**
	 * 使灰色按钮/控件变为"可用"状态
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return true：成功<br/>
	 * false：失败
	 */
	public boolean controlEnable(String title, String text, String control) {
		return this.getAutoItX().controlEnable(title, text, control);
	}

	/**
	 * 设置输入焦点到指定窗口的某个控件上
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return true：成功<br/>
	 * false：失败
	 */
	public boolean controlFocus(String title, String text, String control) {
		return this.getAutoItX().controlFocus(title, text, control);
	}

	/**
	 * 返回指定窗口上键盘焦点所在的控件的类别名.
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @return 成功: 返回在指定窗口上拥有键盘焦点的控件的ClassNameNN(类别名)<br/>
	 * 失败: 返回"" (空字符串),并把 @error 设为 1,说明未找到目标窗口
	 */
	public String controlGetFocus(String title, String text) {
		return this.getAutoItX().controlGetFocus(title, text);
	}

	/**
	 * 返回指定窗口上键盘焦点所在的控件的类别名.
	 * @param title 目标窗口标题
	 * @return 成功: 返回在指定窗口上拥有键盘焦点的控件的ClassNameNN(类别名)<br/>
	 * 失败: 返回"" (空字符串),并把 @error 设为 1,说明未找到目标窗口
	 */
	public String controlGetFocus(String title) {
		return this.getAutoItX().controlGetFocus(title);
	}

	/**
	 * 获取指定控件的内部句柄
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param controlID 要进行交互的控件ID
	 * @return true：成功: 返回获得的句柄(HWND)<br/>
	 * 失败: 返回一个""(空字符串),并把 @error 设为 1,说明未发现匹配窗口
	 */
	public String controlGetHandle(String title, String text, String controlID) {
		return this.getAutoItX().controlGetHandle(title, text, controlID);
	}

	/**
	 * 获取指定控件相对其窗口的 X 轴坐标的位置信息
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param controlID 要进行交互的控件ID
	 * @return 相对其窗口的 X 轴坐标
	 */
	public int controlGetPosX(String title, String text, String controlID) {
		return this.getAutoItX().controlGetPosX(title, text, controlID);
	}

	/**
	 * 获取指定控件相对其窗口的 Y 轴坐标的位置信息
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param controlID 要进行交互的控件ID
	 * @return 相对其窗口的 Y 轴坐标
	 */
	public int controlGetPosY(String title, String text, String controlID) {
		return this.getAutoItX().controlGetPosY(title, text, controlID);
	}

	/**
	 * 获取指定控件宽度信息
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param controlID 要进行交互的控件ID
	 * @return 成功：控件宽度信息<br/>
	 * 失败：设置 @error 为 1
	 */
	public int controlGetPosWidth(String title, String text, String controlID) {
		return this.getAutoItX().controlGetPosWidth(title, text, controlID);
	}

	/**
	 * 获取指定控件高度信息
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param controlID 要进行交互的控件ID
	 * @return 成功：控件高度信息<br/>
	 * 失败：设置 @error 为 1
	 */
	public int controlGetPosHeight(String title, String text, String controlID) {
		return this.getAutoItX().controlGetPosHeight(title, text, controlID);
	}

	/**
	 * 获取指定控件上的文本
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param controlID 要进行交互的控件ID
	 * @return 成功: 返回控件上的文本<br/>
	 * 失败: 把 @error 设为 1,并返回一个空字符串 ""
	 */
	public String controlGetText(String title, String text, String controlID) {
		return this.getAutoItX().controlGetText(title, text, controlID);
	}

	/**
	 * 隐藏指定控件
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param controlID 要进行交互的控件ID
	 * @return true: 成功<br/>
	 * false: 失败
	 */
	public boolean controlHide(String title, String text, String controlID) {
		return this.getAutoItX().controlHide(title, text, controlID);
	}

	/**
	 * ListView返回与给定字符串匹配的项目的位置.若未找到指定字符串则返回值为 -1
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param string 搜索字符串
	 * @param subitem 子项目
	 * @return 项目的位置.若未找到指定字符串则返回值为 -1
	 */
	public int controlListViewFindItem(String title, String text, String control, String string, String subitem) {
		return this.getAutoItX().controlListViewFindItem(title, text, control, string, subitem);
	}

	/**
	 * ListView返回列表中项目总数
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return 列表中项目总数
	 */
	public int controlListViewGetItemCount(String title, String text, String control) {
		return this.getAutoItX().controlListViewGetItemCount(title, text, control);
	}

	/**
	 * ListView返回选中项目的数量
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return 选中项目的数量
	 */
	public int controlListViewGetSelectedCount(String title, String text, String control) {
		return this.getAutoItX().controlListViewGetSelectedCount(title, text, control);
	}

	/**
	 * ListView返回子项目的数量
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return 子项目的数量
	 */
	public int controlListViewGetSubItemCount(String title, String text, String control) {
		return this.getAutoItX().controlListViewGetSubItemCount(title, text, control);
	}

	/**
	 * ListView返回指定项目/子项目的文本
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param item 项目
	 * @param subitem 子项目
	 * @return 项目/子项目的文本
	 */
	public String controlListViewGetText(String title, String text, String control, String item, String subitem) {
		return this.getAutoItX().controlListViewGetText(title, text, control, item, subitem);
	}

	/**
	 * ListView返回指定项目是否被选中
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param item 项目
	 * @return true: 选中<br/>
	 * false：未选中
	 */
	public boolean controlListViewIsSelected(String title, String text, String control, String item) {
		return this.getAutoItX().controlListViewIsSelected(title, text, control, item);
	}

	/**
	 * ListView返回当前选中项目的位置.若 选项=0(默认)则只返回选中的第一个项目;若 选项=1 则返回由竖线"|"作为分隔符的所有选中项目,例如:"0|3|4|10".若没有选中任何项目则返回一个空字符串"".
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return 返回一个字符串，包含选定项的项的索引。若 选项=1 则返回由竖线"|"作为分隔符的所有选中项目,例如:"0|3|4|10".若没有选中任何项目则返回一个空字符串"".
	 */
	public String controlListViewGetSelected(String title, String text, String control) {
		return this.getAutoItX().controlListViewGetSelected(title, text, control);
	}

	/**
	 * ListView返回当前选中项目的位置.若 选项=0(默认)则只返回选中的第一个项目;若 选项=1 则返回由竖线"|"作为分隔符的所有选中项目,例如:"0|3|4|10".若没有选中任何项目则返回一个空字符串"".
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return 返回一个数组，包含选定项的项的索引。若 选项=1 则返回由竖线"|"作为分隔符的所有选中项目,例如:"0|3|4|10".若没有选中任何项目则返回一个空字符串"".
	 */
	public String[] controlListViewGetSelectedArray(String title, String text, String control) {
		return this.getAutoItX().controlListViewGetSelectedArray(title, text, control);
	}

	/**
	 * ListView选中一个或多个项目
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param from 从
	 * @param to 到
	 */
	public void controlListViewSelect(String title, String text, String control, String from, String to) {
		this.getAutoItX().controlListViewSelect(title, text, control, from, to);
	}

	/**
	 * ListView选中所有项目
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param from 从
	 * @param to 到
	 */
	public void controlListViewSelectAll(String title, String text, String control, String from, String to) {
		this.getAutoItX().controlListViewSelectAll(title, text, control, from, to);
	}

	/**
	 * ListView选中所有项目
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param from 从
	 */
	public void controlListViewSelectAll(String title, String text, String control, String from) {
		this.getAutoItX().controlListViewSelectAll(title, text, control, from);
	}

	/**
	 * ListView取消所有项目的选中状态
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 */
	public void controlListViewSelectClear(String title, String text, String control) {
		this.getAutoItX().controlListViewSelectClear(title, text, control);
	}

	/**
	 * ListView切换当前的选中状态
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 */
	public void controlListViewSelectInvert(String title, String text, String control) {
		this.getAutoItX().controlListViewSelectInvert(title, text, control);
	}

	/**
	 * ListView切换当前的视图.可用的视图包括"list"(列表),"details"(详细信息),"smallicons"(小图标),"largeicons"(大图标).
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 */
	public void controlListViewSelectViewChange(String title, String text, String control, String view) {
		this.getAutoItX().controlListViewSelectViewChange(title, text, control, view);
	}

	/**
	 * 在窗口内移动控件
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param x 要移动到的新 X 坐标. 
	 * @param y 要移动到的新 Y 坐标.
	 * @param width 窗口的新宽度.
	 * @param height 窗口的新高度.
	 * @return true: 成功<br/>
	 * false：失败
	 */
	public boolean controlMove(String title, String text, String control, int x, int y, int width, int height) {
		return this.getAutoItX().controlMove(title, text, control, x, y, width, height);
	}

	/**
	 * 在窗口内移动控件
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param x 要移动到的新 X 坐标. 
	 * @param y 要移动到的新 Y 坐标.
	 * @return true: 成功<br/>
	 * false：失败
	 */
	public boolean controlMove(String title, String text, String control, int x, int y) {
		return this.getAutoItX().controlMove(title, text, control, x, y);
	}

	/**
	 * 向指定的控件发送字符串
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param string 要发送到控件的字符串.
	 * @param sendRawKeys 更改程序处理"按键"的方式:<br/>
	 * flag = 0 (默认),按键序列中含有的特殊字符比如 + 和 {LEFT} 将被视为 SHIFT 和 左箭头 键.<br/>
	 * flag = 1, 按键将按原样发送.
	 * @return true：成功<br/>
	 * false：失败
	 */
	public boolean controlSend(String title, String text, String control, String string, boolean sendRawKeys) {
		return this.getAutoItX().controlSend(title, text, control, string, sendRawKeys);
	}

	/**
	 * 向指定的控件发送字符串
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param string 要发送到控件的字符串.
	 * @return true：成功<br/>
	 * false：失败
	 */
	public boolean controlSend(String title, String text, String control, String string) {
		return this.getAutoItX().controlSend(title, text, control, string);
	}

	/**
	 * 修改指定控件的文本
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param string 要设置到控件的新文本
	 * @return true：成功<br/>
	 * false：失败
	 */
	public boolean ControlSetText(String title, String text, String control, String string) {
		return this.getAutoItX().ControlSetText(title, text, control, string);
	}

	/**
	 * 显示已经隐藏的控件
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return true：成功<br/>
	 * false：失败
	 */
	public boolean controlShow(String title, String text, String control) {
		return this.getAutoItX().controlShow(title, text, control);
	}

	/**
	 * 发送一个命令到 TreeView32 控件
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param command 要发送到控件的命令 
	 * @param option 一些命令的附加请求参数.
	 * @param option2 一些命令的附加请求参数.
	 * @return true：成功<br/>
	 * false：失败
	 */
	public boolean controlTreeViewBoolean(String title, String text, String control, String command, String option, String option2) {
		return this.getAutoItX().controlTreeViewBoolean(title, text, control, command, option, option2);
	}

	/**
	 * TreeView选中一个项目 (如果项目支持选中,这里指项目带有选择框)
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param item 项目
	 */
	public void controlTreeViewCheck(String title, String text, String control, String item) {
		this.getAutoItX().controlTreeViewCheck(title, text, control, item);
	}

	/**
	 * TreeView折叠一个项目节点,使它隐藏它的子项目.
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param item 项目
	 */
	public void controlTreeViewCollapse(String title, String text, String control, String item) {
		this.getAutoItX().controlTreeViewCollapse(title, text, control, item);
	}

	/**
	 * TreeView返回项目是否存在
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param item 项目
	 * @return true：存在<br/>
	 * false：不存在
	 */
	public Boolean controlTreeViewExists(String title, String text, String control, String item) {
		return this.getAutoItX().controlTreeViewExists(title, text, control, item);
	}

	/**
	 * TreeView展开一个项目节点,使它显示它的子项目.
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param item 项目
	 */
	public void controlTreeViewExpand(String title, String text, String control, String item) {
		this.getAutoItX().controlTreeViewExpand(title, text, control, item);
	}

	/**
	 * TreeView返回所选项目的子项目数量
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param item 项目
	 * @return 子项目数量
	 */
	public int controlTreeViewGetItemCount(String title, String text, String control, String item) {
		return this.getAutoItX().controlTreeViewGetItemCount(title, text, control, item);
	}

	/**
	 * TreeView返回当前所选项目索引位置
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return 项目索引位置
	 */
	public int controlTreeViewGetSelectedItemIndex(String title, String text, String control) {
		return this.getAutoItX().controlTreeViewGetSelectedItemIndex(title, text, control);
	}

	/**
	 * TreeView返回当前所选项目的文本参考信息
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return 项目的文本参考信息
	 */
	public String controlTreeViewGetSelectedItemText(String title, String text, String control) {
		return this.getAutoItX().controlTreeViewGetSelectedItemText(title, text, control);
	}

	/**
	 * TreeView返回项目文本
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param item 项目
	 * @return 子项目数量
	 */
	public String controlTreeViewGetText(String title, String text, String control, String item) {
		return this.getAutoItX().controlTreeViewGetText(title, text, control, item);
	}

	/**
	 * TreeView返回项目选中状态
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @return 选中状态. 1:被选中, 0:未被选中, -1:没要选择框.
	 */
	public int controlTreeViewIsChecked(String title, String text, String control) {
		return this.getAutoItX().controlTreeViewIsChecked(title, text, control);
	}

	/**
	 * TreeView选择一个项目
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param item 项目
	 */
	public void controlTreeViewSelect(String title, String text, String control, String item) {
		this.getAutoItX().controlTreeViewSelect(title, text, control, item);
	}

	/**
	 * TreeView取消项目选中状态 (如果项目支持选中,这里指项目带有选择框)
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param control 要进行交互的控件
	 * @param item 项目
	 */
	public void controlTreeViewUncheck(String title, String text, String control, String item) {
		this.getAutoItX().controlTreeViewUncheck(title, text, control, item);
	}

	/**
	 * 获取标准状态栏控件的文本
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @param part 要读取的状态栏的文本"部分",默认值为 1. 1 表示状态栏上的(左边)第一个可能的分区文本,通常包含最有用的信息(比如"准备","载入中..."等等).
	 * @return 成功: 返回获得的文本<br/>
	 * 失败: 返回一个空字符串并把 @error 设为 1 说明无法读取文本.
	 */
	public String statusbarGetText(String title, String text, int part) {
		return this.getAutoItX().statusbarGetText(title, text, part);
	}

	/**
	 * 获取标准状态栏控件的文本
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @return 成功: 返回获得的文本<br/>
	 * 失败: 返回一个空字符串并把 @error 设为 1 说明无法读取文本.
	 */
	public String StatusbarGetText(String title, String text) {
		return this.getAutoItX().StatusbarGetText(title, text);
	}

	/**
	 * 获取标准状态栏控件的文本
	 * @param title 目标窗口标题
	 * @return 成功: 返回获得的文本<br/>
	 * 失败: 返回一个空字符串并把 @error 设为 1 说明无法读取文本.
	 */
	public String statusbarGetText(String title) {
		return this.getAutoItX().statusbarGetText(title);
	}

	/**
	 * 激活指定的窗口(设置焦点到该窗口,使其成为活动窗口)
	 * @param title 目标窗口标题.参考 标题特殊定义(模式 1:只匹配标题的前面部分、模式 2：标题的任意子字符串皆可、模式 3：完全匹配标题、模式 4：高级模式，已经被高级窗口描述取代,不需要设置任何模式即可使用.)
	 * @param text 要激活的窗口包含的文本
	 */
	public void winActivate(String title, String text) {
		this.getAutoItX().winActivate(title, text);
	}

	/**
	 * 激活指定的窗口(设置焦点到该窗口,使其成为活动窗口)
	 * @param title 目标窗口标题.参考 标题特殊定义(模式 1:只匹配标题的前面部分、模式 2：标题的任意子字符串皆可、模式 3：完全匹配标题、模式 4：高级模式，已经被高级窗口描述取代,不需要设置任何模式即可使用.)
	 */
	public void winActivate(String title) {
		this.getAutoItX().winActivate(title);
	}

	/**
	 * 检查指定的窗口是否存在且当前被激活
	 * @param title 目标窗口标题.参考 标题特殊定义(模式 1:只匹配标题的前面部分、模式 2：标题的任意子字符串皆可、模式 3：完全匹配标题、模式 4：高级模式，已经被高级窗口描述取代,不需要设置任何模式即可使用.)
	 * @param text 目标窗口文本
	 */
	public void winActive(String title, String text) {
		this.getAutoItX().winActive(title, text);
	}

	/**
	 * 检查指定的窗口是否存在且当前被激活
	 * @param title 目标窗口标题.参考 标题特殊定义(模式 1:只匹配标题的前面部分、模式 2：标题的任意子字符串皆可、模式 3：完全匹配标题、模式 4：高级模式，已经被高级窗口描述取代,不需要设置任何模式即可使用.)
	 */
	public void winActive(String title) {
		this.getAutoItX().winActive(title);
	}

	/**
	 * 关闭指定窗口
	 * @param title 目标窗口标题.参考 标题特殊定义(模式 1:只匹配标题的前面部分、模式 2：标题的任意子字符串皆可、模式 3：完全匹配标题、模式 4：高级模式，已经被高级窗口描述取代,不需要设置任何模式即可使用.)
	 * @param text 要关闭的窗口包含的文本
	 */
	public void winClose(String title, String text) {
		this.getAutoItX().winClose(title, text);
	}

	/**
	 * 关闭指定窗口
	 * @param title 目标窗口标题.参考 标题特殊定义(模式 1:只匹配标题的前面部分、模式 2：标题的任意子字符串皆可、模式 3：完全匹配标题、模式 4：高级模式，已经被高级窗口描述取代,不需要设置任何模式即可使用.)
	 */
	public void winClose(String title) {
		this.getAutoItX().winClose(title);
	}

	/**
	 * 检查指定的窗口是否存在
	 * 注意: 即使目标窗口处于隐藏状态,WinExist 仍将返回 1
	 * @param title 目标窗口标题.参考 标题特殊定义(模式 1:只匹配标题的前面部分、模式 2：标题的任意子字符串皆可、模式 3：完全匹配标题、模式 4：高级模式，已经被高级窗口描述取代,不需要设置任何模式即可使用.)
	 * @param text 要检查的窗口所包含的文本.
	 * @return true: 窗口存在<br/>
	 * false: 窗口不存在
	 */
	public boolean winExists(String title, String text) {
		return this.getAutoItX().winExists(title, text);
	}

	/**
	 * 检查指定的窗口是否存在
	 * 注意: 即使目标窗口处于隐藏状态,WinExist 仍将返回 1
	 * @param title 目标窗口标题.参考 标题特殊定义(模式 1:只匹配标题的前面部分、模式 2：标题的任意子字符串皆可、模式 3：完全匹配标题、模式 4：高级模式，已经被高级窗口描述取代,不需要设置任何模式即可使用.)
	 * @return true: 窗口存在<br/>
	 * false: 窗口不存在
	 */
	public boolean winExists(String title) {
		return this.getAutoItX().winExists(title);
	}

	/**
	 * 返回顶层窗口的插入符的 X 坐标位置
	 * @return 成功: X 坐标<br/>
	 * 失败: 把 @error 设为 1
	 */
	public int winGetCaretPosX() {
		return this.getAutoItX().winGetCaretPosX();
	}

	/**
	 * 返回顶层窗口的插入符的 Y 坐标位置
	 * @return 成功: Y 坐标<br/>
	 * 失败: 把 @error 设为 1
	 */
	public int winGetCaretPosY() {
		return this.getAutoItX().winGetCaretPosY();
	}

	/**
	 * 获取指定窗口的所有控件类的列表
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @return 成功: 返回一个含有所有控件类的字符串<br/>
	 * 失败: 返回值为"",并把 @error 设为 1,说明不存在符合匹配要求的窗口.
	 */
	public String winGetClassList(String title, String text) {
		return this.getAutoItX().winGetClassList(title, text);
	}

	/**
	 * 获取指定窗口的客户区的宽度
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @return 成功: 客户区的宽度<br/>
	 * 失败: 返回值为0,并把 @error 设为1,说明未找到目标窗口.
	 */
	public int winGetClientSizeWidth(String title, String text) {
		return this.getAutoItX().winGetClientSizeWidth(title, text);
	}

	/**
	 * 获取指定窗口的客户区的宽度
	 * @param title 目标窗口标题
	 * @return 成功: 客户区的宽度<br/>
	 * 失败: 返回值为0,并把 @error 设为1,说明未找到目标窗口.
	 */
	public int winGetClientSizeWidth(String title) {
		return this.getAutoItX().winGetClientSizeWidth(title);
	}

	/**
	 * 获取指定窗口的客户区的高度
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本
	 * @return 成功: 客户区的高度<br/>
	 * 失败: 返回值为0,并把 @error 设为1,说明未找到目标窗口.
	 */
	public int winGetClientSizeHeight(String title, String text) {
		return this.getAutoItX().winGetClientSizeHeight(title, text);
	}

	/**
	 * 获取指定窗口的客户区的高度
	 * @param title 目标窗口标题
	 * @return 成功: 客户区的高度<br/>
	 * 失败: 返回值为0,并把 @error 设为1,说明未找到目标窗口.
	 */
	public int winGetClientSizeHeight(String title) {
		return this.getAutoItX().winGetClientSizeHeight(title);
	}

	/**
	 * 获取指定窗口的内部句柄
	 * @param title 目标窗口标题.
	 * @param text 目标窗口文本.
	 * @return 成功: 返回一个含有目标窗口句柄的字符串.<br>
	 * 失败: 返回一个""(空字符串),并把 @error 设为 1,说明不存在符合匹配要求的窗口. 
	 */
	public String winGetHandle(String title, String text) {
		return this.getAutoItX().winGetHandle(title, text);
	}

	/**
	 * 获取指定窗口的内部句柄
	 * @param title 目标窗口标题.
	 * @return 成功: 返回一个含有目标窗口句柄的字符串.<br>
	 * 失败: 返回一个""(空字符串),并把 @error 设为 1,说明不存在符合匹配要求的窗口. 
	 */
	public String winGetHandle(String title) {
		return this.getAutoItX().winGetHandle(title);
	}

	/**
	 * 获取指定窗口的 X 坐标
	 * @param title 目标窗口标题.
	 * @param text 目标窗口文本.
	 * @return 成功: 返回窗口的 X 坐标<br/>
	 * 失败: 返回值为1,并把 @error 设为 1,说明未找到目标窗口. 
	 */
	public int winGetPosX(String title, String text) {
		return this.getAutoItX().winGetPosX(title, text);
	}

	/**
	 * 获取指定窗口的 X 坐标
	 * @param title 目标窗口标题.
	 * @return 成功: 返回窗口的 X 坐标<br/>
	 * 失败: 返回值为1,并把 @error 设为 1,说明未找到目标窗口. 
	 */
	public int winGetPosX(String title) {
		return this.getAutoItX().winGetPosX(title);
	}

	/**
	 * 获取指定窗口的 Y 坐标
	 * @param title 目标窗口标题.
	 * @param text 目标窗口文本.
	 * @return 成功: 返回窗口的 Y 坐标<br/>
	 * 失败: 返回值为1,并把 @error 设为 1,说明未找到目标窗口. 
	 */
	public int winGetPosY(String title, String text) {
		return this.getAutoItX().winGetPosY(title, text);
	}
	
	/**
	 * 获取指定窗口的 Y 坐标
	 * @param title 目标窗口标题.
	 * @return 成功: 返回窗口的 Y 坐标<br/>
	 * 失败: 返回值为1,并把 @error 设为 1,说明未找到目标窗口. 
	 */
	public int winGetPosY(String title) {
		return this.getAutoItX().winGetPosY(title);
	}

	/**
	 * 获取指定窗口的宽度
	 * @param title 目标窗口标题.
	 * @param text 目标窗口文本.
	 * @return 成功: 目标窗口的宽度<br/>
	 * 失败: 返回值为1,并把 @error 设为 1,说明未找到目标窗口. 
	 */
	public int winGetPosWidth(String title, String text) {
		return this.getAutoItX().winGetPosWidth(title, text);
	}

	/**
	 * 获取指定窗口的宽度
	 * @param title 目标窗口标题.
	 * @return 成功: 目标窗口的宽度<br/>
	 * 失败: 返回值为1,并把 @error 设为 1,说明未找到目标窗口. 
	 */
	public int winGetPosWidth(String title) {
		return this.getAutoItX().winGetPosWidth(title);
	}

	/**
	 * 获取指定窗口的高度
	 * @param title 目标窗口标题.
	 * @param text 目标窗口文本.
	 * @return 成功: 目标窗口的高度<br/>
	 * 失败: 返回值为1,并把 @error 设为 1,说明未找到目标窗口. 
	 */
	public int winGetPosHeight(String title, String text) {
		return this.getAutoItX().winGetPosHeight(title, text);
	}

	/**
	 * 获取指定窗口的高度
	 * @param title 目标窗口标题.
	 * @return 成功: 目标窗口的高度<br/>
	 * 失败: 返回值为1,并把 @error 设为 1,说明未找到目标窗口. 
	 */
	public int winGetPosHeight(String title) {
		return this.getAutoItX().winGetPosHeight(title);
	}

	/**
	 * 获取指定窗口关联的进程ID(PID)
	 * @param title 目标窗口标题.
	 * @param text 目标窗口文本.
	 * @return 成功: 返回数值型进程ID(PID)<br/>
	 * 失败: 返回值为 -1.
	 */
	public String winGetProcess(String title, String text) {
		return this.getAutoItX().winGetProcess(title, text);
	}

	/**
	 * 获取指定窗口关联的进程ID(PID)
	 * @param title 目标窗口标题.
	 * @return 成功: 返回数值型进程ID(PID)<br/>
	 * 失败: 返回值为 -1.
	 */
	public String winGetProcess(String title) {
		return this.getAutoItX().winGetProcess(title);
	}

	/**
	 * 获取指定窗口的状态
	 * @param title 目标窗口标题.
	 * @param text 目标窗口文本.
	 * @return 成功: 返回一个指示窗口状态的值.多个状态值被加到一起,因此要检查该窗口是否具有指定状态请使用 BitAND() 函数:<br/>
	 * 1 = 窗口存在<br/>
	 * 2 = 窗口可见<br/>
	 * 4 = 窗口可用(未被禁用)<br/>
	 * 8 = 窗口为激活状态<br/>
	 * 16 = 窗口为最小化状态<br/>
	 * 32 = 窗口为最大化状态<br/>
	 * 失败: 返回值为0,并把 @error 设为 1,说明未找到目标窗口
	 */
	public int winGetState(String title, String text) {
		return this.getAutoItX().winGetState(title, text);
	}

	/**
	 * 获取指定窗口的状态
	 * @param title 目标窗口标题.
	 * @return 成功: 返回一个指示窗口状态的值.多个状态值被加到一起,因此要检查该窗口是否具有指定状态请使用 BitAND() 函数:<br/>
	 * 1 = 窗口存在<br/>
	 * 2 = 窗口可见<br/>
	 * 4 = 窗口可用(未被禁用)<br/>
	 * 8 = 窗口为激活状态<br/>
	 * 16 = 窗口为最小化状态<br/>
	 * 32 = 窗口为最大化状态<br/>
	 * 失败: 返回值为0,并把 @error 设为 1,说明未找到目标窗口
	 */
	public int winGetState(String title) {
		return this.getAutoItX().winGetState(title);
	}

	/**
	 * 获取指定窗口中的文本
	 * @param title 目标窗口标题.
	 * @param text 目标窗口文本.
	 * @return 成功: 返回指定窗口里面包含的文本<br/>
	 * 失败: 返回0(如果没有匹配的标题)
	 */
	public String winGetText(String title, String text) {
		return this.getAutoItX().winGetText(title, text);
	}

	/**
	 * 获取指定窗口中的文本
	 * @param title 目标窗口标题.
	 * @return 成功: 返回指定窗口里面包含的文本<br/>
	 * 失败: 返回0(如果没有匹配的标题)
	 */
	public String winGetText(String title) {
		return this.getAutoItX().winGetText(title);
	}

	/**
	 * 获取指定窗口的完整标题名
	 * @param title 目标窗口标题.
	 * @param text 目标窗口文本.
	 * @return 成功: 返回指定窗口的完整标题字符串.<br/>
	 * 失败: 返回 0 (如果没有匹配的标题).
	 */
	public String winGetTitle(String title, String text) {
		return this.getAutoItX().winGetTitle(title, text);
	}

	/**
	 * 获取指定窗口的完整标题名
	 * @param title 目标窗口标题.
	 * @return 成功: 返回指定窗口的完整标题字符串.<br/>
	 * 失败: 返回 0 (如果没有匹配的标题).
	 */
	public String winGetTitle(String title) {
		return this.getAutoItX().winGetTitle(title);
	}

	/**
	 * 强行关闭指定窗口
	 * @param title 目标窗口标题.
	 * @param text 目标窗口文本.
	 */
	public void winKill(String title, String text) {
		this.getAutoItX().winKill(title, text);
	}

	/**
	 * 强行关闭指定窗口
	 * @param title 目标窗口标题.
	 */
	public void winKill(String title) {
		this.getAutoItX().winKill(title);
	}

	/**
	 * 获取窗口列表
	 * @param title 目标窗口标题.
	 * @param text 目标窗口文本.
	 * @return 返回包含匹配的窗口标题和句柄的数组.<br>
	 * 若没有指定窗口标题及窗口文本则返回所有顶层窗口.<br>
	 * 本函数返回的数组是一个二维数组,包含下列信息:<br>
	 * $array[0][0] = 窗口数<br>
	 * $array[1][0] = 第1个窗口的标题<br>
	 * $array[1][1] = 第1个窗口的句柄(HWND)<br>
	 * $array[2][0] = 第2个窗口的标题<br>
	 * $array[2][1] = 第2个窗口的句柄(HWND)<br>
	 * ...<br>
	 * $array[n][0] = 第n个窗口的标题<br>
	 * $array[n][1] = 第n个窗口的句柄(HWND)
	 */
	public String[][] winList(String title, String text) {
		return this.getAutoItX().winList(title, text);
	}

	/**
	 * 获取窗口列表
	 * @param title 目标窗口标题.
	 * @return 返回包含匹配的窗口标题和句柄的数组.<br>
	 * 若没有指定窗口标题及窗口文本则返回所有顶层窗口.<br>
	 * 本函数返回的数组是一个二维数组,包含下列信息:<br>
	 * $array[0][0] = 窗口数<br>
	 * $array[1][0] = 第1个窗口的标题<br>
	 * $array[1][1] = 第1个窗口的句柄(HWND)<br>
	 * $array[2][0] = 第2个窗口的标题<br>
	 * $array[2][1] = 第2个窗口的句柄(HWND)<br>
	 * ...<br>
	 * $array[n][0] = 第n个窗口的标题<br>
	 * $array[n][1] = 第n个窗口的句柄(HWND)
	 */
	public String[][] winList(String title) {
		return this.getAutoItX().winList(title);
	}

	/**
	 * 调用窗口中的某个菜单项目
	 * @param title 目标窗口标题.
	 * @param text 目标窗口文本.
	 * @param item 菜单项目的文本
	 * @return true: 成功<br/>
	 * false: 失败
	 */
	public boolean winMenuSelectItem(String title, String text, String item) {
		return this.getAutoItX().winMenuSelectItem(title, text, item);
	}

	/**
	 * 调用窗口中的某个菜单项目
	 * @param title 目标窗口标题.
	 * @param text 目标窗口文本.
	 * @param item 菜单项目的文本
	 * @param item2 子菜单项目的文本.
	 * @return true: 成功<br/>
	 * false: 失败
	 */
	public boolean winMenuSelectItem(String title, String text, String item, String item2) {
		return this.getAutoItX().winMenuSelectItem(title, text, item, item2);
	}

	/**
	 * 调用窗口中的某个菜单项目
	 * @param title 目标窗口标题.
	 * @param text 目标窗口文本.
	 * @param item 菜单项目的文本
	 * @param item2 子菜单项目的文本.
	 * @param item3 子菜单项目的文本.
	 * @return true: 成功<br/>
	 * false: 失败
	 */
	public boolean winMenuSelectItem(String title, String text, String item, String item2, String item3) {
		return this.getAutoItX().winMenuSelectItem(title, text, item, item2, item3);
	}

	/**
	 * 调用窗口中的某个菜单项目
	 * @param title 目标窗口标题.
	 * @param text 目标窗口文本.
	 * @param item 菜单项目的文本
	 * @param item2 子菜单项目的文本.
	 * @param item3 子菜单项目的文本.
	 * @param item4 子菜单项目的文本.
	 * @param item5 子菜单项目的文本.
	 * @param item6 子菜单项目的文本.
	 * @param item7 子菜单项目的文本.
	 * @return true: 成功<br/>
	 * false: 失败
	 */
	public boolean winMenuSelectItem(String title, String text, String item, String item2, String item3, String item4, String item5, String item6, String item7) {
		return this.getAutoItX().winMenuSelectItem(title, text, item, item2, item3, item4, item5, item6, item7);
	}

	/**
	 * 最小化全部窗口
	 */
	public void winMinimizeAll() {
		this.getAutoItX().winMinimizeAll();
	}

	/**
	 * 撤销此前的最小化全部窗口 ( WinMinimizeAll ) 的效果
	 */
	public void winMinimizeAllUndo() {
		this.getAutoItX().winMinimizeAllUndo();
	}

	/**
	 * 移动指定的窗口或调整窗口的大小
	 * @param title 需要移动/重新设置大小的目标窗体标题
	 * @param text 目标窗口文本.
	 * @param x 要移动到的新 X 坐标.
	 * @param y 要移动到的新 Y 坐标.
	 * @param width 窗口的新宽度.
	 * @param height 窗口的新高度.
	 */
	public void winMove(String title, String text, int x, int y, int width, int height) {
		this.getAutoItX().winMove(title, text, x, y, width, height);
	}

	/**
	 * 移动指定的窗口或调整窗口的大小
	 * @param title 需要移动/重新设置大小的目标窗体标题
	 * @param text 目标窗口文本.
	 * @param x 要移动到的新 X 坐标.
	 * @param y 要移动到的新 Y 坐标.
	 */
	public void winMove(String title, String text, int x, int y) {
		this.getAutoItX().winMove(title, text, x, y);
	}

	/**
	 * 设置指定窗口的"总是在顶层"属性
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本.
	 * @param isTopMost 用以决定目标窗口是否具有"顶层窗口"属性:<br/>
	 * 1=设置为顶层窗口,0 = 取消顶层窗口属性 
	 */
	public void winSetOnTop(String title, String text, boolean isTopMost) {
		this.getAutoItX().winSetOnTop(title, text, isTopMost);
	}

	/**
	 * 显示,隐藏,最小化,最大化或还原一个窗口.
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本.
	 * @param flag 可执行程序的"显示"标志:<br/>
	 * SW_HIDE = 隐藏窗口<br/>
	 * SW_SHOW = 显示以前隐藏的窗口<br/>
	 * SW_MINIMIZE = 最小化窗口<br/>
	 * SW_MAXIMIZE = 最大化窗口<br/>
	 * SW_RESTORE = 撤销窗口的最小化或最大化状态<br/>
	 * SW_DISABLE = 禁用窗口<br/>
	 * SW_ENABLE = 使窗口可用 
	 */
	public void winSetState(String title, String text, int flag) {
		this.getAutoItX().winSetState(title, text, flag);
	}

	/**
	 * 修改指定窗口的标题
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本.
	 * @param newtitle 需要修改成的新标题.
	 */
	public void winSetTitle(String title, String text, String newtitle) {
		this.getAutoItX().winSetTitle(title, text, newtitle);
	}

	/**
	 * 设置指定窗口的透明度(仅支持Windows 2000/XP或更高版本) 
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本.
	 * @param transparency 设置指定窗口的透明度(仅支持Windows 2000/XP或更高版本) 
	 * @return true；成功<br>
	 * false：失败, 若操作系统不支持本函数则 @error 将被设为1.
	 */
	public boolean winSetTrans(String title, String text, int transparency) {
		return this.getAutoItX().winSetTrans(title, text, transparency);
	}

	/**
	 * 暂停脚本的执行直至指定窗口存在(出现)为止.
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本.
	 * @param timeout 超时时间,以秒为单位.
	 * @return true: 成功<br/>
	 * false: 失败
	 */
	public boolean winWait(String title, String text, int timeout) {
		return this.getAutoItX().winWait(title, text, timeout);
	}

	/**
	 * 暂停脚本的执行直至指定窗口存在(出现)为止.
	 * @param title 目标窗口标题
	 * @return true: 成功<br/>
	 * false: 失败
	 */
	public boolean winWait(String title) {
		return this.getAutoItX().winWait(title);
	}

	/**
	 * 暂停脚本的执行直至指定窗口存在(出现)为止.
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本.
	 * @return true: 成功<br/>
	 * false: 失败
	 */
	public boolean winWait(String title, String text) {
		return this.getAutoItX().winWait(title, text);
	}

	/**
	 * 暂停脚本的执行直至指定窗口被激活(成为活动状态)为止.
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本.
	 * @param timeout 超时时间,以秒为单位.
	 * @return true: 成功<br/>
	 * false: 失败
	 */
	public boolean winWaitActive(String title, String text, int timeout) {
		return this.getAutoItX().winWaitActive(title, text, timeout);
	}

	/**
	 * 暂停脚本的执行直至指定窗口被激活(成为活动状态)为止.
	 * @param title 目标窗口标题
	 * @param text 目标窗口文本.
	 * @return true: 成功<br/>
	 * false: 失败
	 */
	public boolean winWaitActive(String title, String text) {
		return this.getAutoItX().winWaitActive(title, text);
	}

	/**
	 * 暂停脚本的执行直至指定窗口被激活(成为活动状态)为止.
	 * @param title 目标窗口标题
	 * @return true: 成功<br/>
	 * false: 失败
	 */
	public boolean winWaitActive(String title) {
		return this.getAutoItX().winWaitActive(title);
	}

	/**
	 * 暂停脚本的执行直至所指定窗口不再存在为止
	 * @param title 目标窗口标题.参考 标题特殊定义(模式 1:只匹配标题的前面部分、模式 2：标题的任意子字符串皆可、模式 3：完全匹配标题、模式 4：高级模式，已经被高级窗口描述取代,不需要设置任何模式即可使用.)
	 * @param text 目标窗口文本
	 * @param timeout 超时时间,以秒为单位
	 * @return true: 成功 <br/>
	 * false: 失败
	 */
	public boolean winWaitClose(String title, String text, int timeout) {
		return this.getAutoItX().winWaitClose(title, text, timeout);
	}

	/**
	 * 暂停脚本的执行直至所指定窗口不再存在为止
	 * @param title 目标窗口标题.参考 标题特殊定义(模式 1:只匹配标题的前面部分、模式 2：标题的任意子字符串皆可、模式 3：完全匹配标题、模式 4：高级模式，已经被高级窗口描述取代,不需要设置任何模式即可使用.)
	 * @return true: 成功 <br/>
	 * false: 失败
	 */
	public boolean winWaitClose(String title) {
		return this.getAutoItX().winWaitClose(title);
	}

	/**
	 * 暂停脚本的执行直至所指定窗口不再存在为止
	 * @param title 目标窗口标题.参考 标题特殊定义(模式 1:只匹配标题的前面部分、模式 2：标题的任意子字符串皆可、模式 3：完全匹配标题、模式 4：高级模式，已经被高级窗口描述取代,不需要设置任何模式即可使用.)
	 * @param text 目标窗口文本
	 * @return true: 成功 <br/>
	 * false: 失败
	 */
	public boolean winWaitClose(String title, String text) {
		return this.getAutoItX().winWaitClose(title, text);
	}

	/**
	 * 暂停脚本的执行直至指定窗口不是激活状态为止.
	 * @param title 目标窗口标题.参考 标题特殊定义(模式 1:只匹配标题的前面部分、模式 2：标题的任意子字符串皆可、模式 3：完全匹配标题、模式 4：高级模式，已经被高级窗口描述取代,不需要设置任何模式即可使用.)
	 * @param text 目标窗口文本
	 * @param timeout 超时时间,以秒为单位
	 * @return true: 成功 <br/>
	 * false: 失败
	 */
	public boolean winWaitNoActive(String title, String text, int timeout) {
		return this.getAutoItX().winWaitNoActive(title, text, timeout);
	}

	/**
	 * 暂停脚本的执行直至指定窗口不是激活状态为止.
	 * @param title 目标窗口标题.参考 标题特殊定义(模式 1:只匹配标题的前面部分、模式 2：标题的任意子字符串皆可、模式 3：完全匹配标题、模式 4：高级模式，已经被高级窗口描述取代,不需要设置任何模式即可使用.)
	 * @return true: 成功 <br/>
	 * false: 失败
	 */
	public boolean winWaitNoActive(String title) {
		return this.getAutoItX().winWaitNoActive(title);
	}

	/**
	 * 暂停脚本的执行直至指定窗口不是激活状态为止.
	 * @param title 目标窗口标题.参考 标题特殊定义(模式 1:只匹配标题的前面部分、模式 2：标题的任意子字符串皆可、模式 3：完全匹配标题、模式 4：高级模式，已经被高级窗口描述取代,不需要设置任何模式即可使用.)
	 * @param text 目标窗口文本
	 * @return true: 成功 <br/>
	 * false: 失败
	 */
	public boolean winWaitNoActive(String title, String text) {
		return this.getAutoItX().winWaitNoActive(title, text);
	}

}

